home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_1 / fsmenu < prev    next >
Internet Message Format  |  1995-03-31  |  12KB

  1. From comp.sys.handhelds Fri Feb  1 07:39:15 1991
  2. Path: mentor.cc.purdue.edu!purdue!news.cs.indiana.edu!msi.umn.edu!noc.MR.NET!gacvx2.gac.edu!hhdist
  3. From: HUBER@gacvx1.gac.edu (Tom Huber, Gustavus Adolphus College, (507) 933-7036)
  4. Newsgroups: comp.sys.handhelds
  5. Subject: RE: HP48SX: Full screen menu program, mark III
  6. Message-ID: <A8AD50EC40003CF2@gacvx1.gac.edu>
  7. Date: 31 Jan 91 23:22:00 GMT
  8. Lines: 287
  9.  
  10. Michael Woodhams posted the program FSMENU, mark III
  11. (Message-ID: <5816@idunno.Princeton.EDU>)
  12.  
  13. Michael has added several excellent features to the full screen menu
  14. program.  There were, however, several typos in the posted programs.
  15. Below are downloadable versions of the programs with the bugs (at least the
  16. ones I found) fixed
  17.  
  18. (PS: I would recommend that you put KEYSIZE, UCLEAR and UMOD in your
  19. HOME directory rather than in the FSMENU directory as recommended by
  20. Michael otherwise it will be difficult to use UMOD from another directory)
  21.  
  22.  
  23.     Tom Huber,   Physics Department 
  24.     Gustavus Adolphus College,   St. Peter, MN  56082
  25.     Bitnet: HUBER@GACVAX1   Internet: HUBER@GAC.EDU  (507)933-7036
  26.     
  27.  
  28. Checksum: #B2F7h  Size:492.5  (Evaluated by 'KEYSIZE' BYTES)
  29. KEYSIZE
  30. %%HP: T(3)A(D)F(.);
  31. {
  32.   { 6 #20d #22d #42d #22d }
  33.   { 6 #20d #22d #42d #22d }
  34.   { 6 #20d #22d #42d #22d }
  35.   { 6 #20d #22d #42d #22d }
  36.   { 5 #42d #44d #64d #22d }
  37.   { 5 #20d #24d #49d #27d }
  38.   { 5 #20d #24d #49d #27d }
  39.   { 5 #20d #24d #49d #27d }
  40. }
  41.  
  42. Checksum: #7ED9h  Size:776
  43. UCLEAR
  44. %%HP: T(3)A(D)F(.);
  45. \<<
  46.  "Enter number of rows"        @ Get number of rows of keys and
  47.  { V } INPUT OBJ\->        @ store it in local variable "n"
  48.  \-> n
  49.   \<<
  50.    IF 'n<1 OR n>8 OR FP(n)\=/0' THEN
  51.     KILL            @ quit if n is out of range
  52.    END
  53.    ERASE {#0d #0d} PVIEW    @ erase screen and display it
  54.    1 n FOR row            @ for each row
  55.     KEYSIZE row GET        @ get the list of key size parameters
  56.     LIST\-> DROP        @ disassemble it into components
  57.     \-> m e1 s2 e2 inc          @ and store in local variables
  58.                 @ m=number of keys in this row
  59.                 @ e1=last pixel in the first key
  60.                 @ s2=first pixel in the second key
  61.                 @ e2=last pixel in the second key
  62.                 @ inc=distance between start of second and
  63.                                 @     third keys
  64.      \<<
  65.       1 m FOR col        @ for each key in the row
  66.        IF 'col==1' THEN    @ if first row, then
  67.         #0d e1            @ draw from pixel 0 to e1
  68.        ELSE            @ else
  69.         col 2 - inc *
  70.         DUP s2 +        @ draw from s2+(col-2)*inc
  71.         SWAP e2 +        @ to e2+(col-2)*inc
  72.        END
  73.        \-> x1 x2        @ put the left and right x-coordinates of
  74.                 @ the key into x1 and x2
  75.         \<<
  76.          row 1 - 8 * DUP 6 + FOR line
  77.                 @ for line = (row-1)*8 to (row-1)*8+6
  78.                 @ (for line=top pixel of key to bottom pixel)
  79.           x1 line R\->B 2 \->LIST @ make coordinate list {x1 line}
  80.           x2 line R\->B 2 \->LIST @ make coordinate list {x2 line}
  81.           LINE            @ draw line between coordinates
  82.          NEXT            @ next line
  83.         \>>            @ end of x1, x2 local variable block
  84.       NEXT            @ next col (i.e. next key in the row)
  85.      \>>            @ end of m, e1, s2, e2, inc variable block
  86.    NEXT                @ next row
  87.    PICT {#8d #41d} "\Ga"    @ write alpha on the alpha shift key
  88.    1 \->GROB GXOR        @ (even if fewer than 6 rows were requested)
  89.    PICT {#7d #49d}
  90.    GROB 7 5 4020F72444 GXOR     @ write left arrow on gold shift key
  91.    PICT {#7d #57d}
  92.    GROB 7 5 0102F71211 GXOR     @ write right arrow on blue shift key
  93.    PICT {#0d #0d}        @ put PICT, {#0d #0d}, {#131d n*#8-#1}
  94.    #131d n #8d * #1d - 2 \->LIST @ onto stack
  95.    SUB                @ and extract the picture of the keyboard
  96.                                 @   from the graphics screen. (If there were
  97.                 @   not enough rows for the alpha and/or shift
  98.                 @   keys to be displayed, the alpha, left and
  99.                 @   right arrows that were drawn on the screen
  100.                 @   will be left behind at this stage
  101.    { }                @ Now make the list of key definitions
  102.                 @ These braces will delimit the list of
  103.                 @   row information
  104.    1 n FOR row            @ for each row
  105.     { }                @ These braces will delimit the list of
  106.                 @   information for each key in the row
  107.     1 KEYSIZE row GET 1 GET    @ get number of keys in the row from KEYSIZE
  108.      FOR col            @ for each key in the row
  109.      { { } } +            @ add an empty list to the row list 
  110.                 @ for each key in the row
  111.     NEXT            @ next col
  112.     1 \->LIST                   @ Imbed the row list in another set of braces
  113.     +                @ add the row list to the master list
  114.    NEXT                @ next row
  115.   \>>                           @ end of n local variable block
  116. \>>                             @ end of UCLEAR program
  117.  
  118. Checksum: #B2E9h  Size:1632
  119. UMOD
  120. %%HP: T(3)A(D)F(.);
  121. \<<
  122.  DUP RCL SIZE            @ find size (number of rows) of values variable
  123.  \-> ugrob uvalues n        @ store names of variables in ugrob, uvalues
  124.                 @ and number of rows in n
  125.   \<<
  126.    ugrob RCL PICT STO        @ store keyboard picture in graphics screen
  127.    {#0d #0d} PVIEW         @ and display it
  128.    0 WAIT            @ get a keystroke
  129.    IF DUP n 1 + 10 * > THEN    @ if keystroke comes from a row after row n
  130.     DROP ugrob uvalues KILL    @ restore stack and kill program
  131.    END
  132.    DUP 10 / IP            @ find row number of the key
  133.    SWAP IP 10 MOD        @ and column number of the key
  134.    \-> row col            @ store in local variables row, col
  135.     \<<
  136.      KEYSIZE row GET        @ get list for this row from KEYSIZE
  137.      IF 'col==1' THEN        @ if this is the first key in the row
  138.       2 GET #0d            @ the rightmost and leftmost pixels of the key
  139.                 @ are e1 (2nd element of list) and #0
  140.      ELSE            @ if this is not the first key in the row
  141.       LIST\-> DROP        @ disassemble the list
  142.       col 2 - *            @ put inc*(col-2) on the stack
  143.       SWAP OVER            @ stack contains:
  144.                 @ m e1 s2 inc*(col-2) e2 inc*(col-2)
  145.       + ROT ROT +        @ stack contains:
  146.                 @ m e1 e2+inc*(col-2) s2+inc*(col-2)
  147.       ROT DROP ROT DROP        @ stack contains:
  148.                 @ e2+inc*(col-2) s2+inc*(col-2)
  149.                 @ i.e. rightmost and leftmost pixels of the key
  150.      END
  151.      row 1 - 8 *        @ stack contains:
  152.                 @(rightmost pixel) (leftmost pixel) (top pixel)
  153.      \-> x2 x1 y        @ store these in x2, x1, y
  154.       \<<
  155.        PICT            @ put PICT on stack for use later
  156.        0            @ put a junk value on stack to drop inside loop
  157.        DO
  158.         DROP            @ drop junk value or previous bad label
  159.     STD            @ put calc in std mode to display row and col
  160.         row "," + col +
  161.         " Label?" +        @ assemble prompt string
  162.         { \Ga } INPUT        @ input label for key as a string
  163.         1 \->GROB        @ turn it into a grob
  164.        UNTIL
  165.         DUP SIZE DROP        @ loop until x size of grob is smaller than key
  166.         'x2-x1' EVAL \<=    @ ("\<=" means less than or equals. I may have
  167.                 @ the wrong code here.)
  168.        END
  169.        DUP SIZE DROP        @ get x size of grob on stack
  170.        IF DUP #0d == THEN    @ if the label was a null string
  171.         DROP DROP DROP        @ drop PICT, grob and grob size from stack,
  172.                 @ and leave keyboard picture unchanged
  173.        ELSE
  174.         y 'y+6' FOR line    @ for each row of pixels in the key
  175.          x1 line R\->B 2 \->LIST @ make pixel coordinate {x1 line}
  176.          x2 line R\->B 2 \->LIST @ make pixel coordinate {x2 line}
  177.          LINE            @ draw a line between them
  178.         NEXT            @ the key has now been erased
  179.     'x1+x2+2' EVAL SWAP -    @ find x-coordinate to put grob at
  180.         2 /            @ (x size of grob was already on stack)
  181.     y #1d +            @ find y-coordinate to put grob at
  182.         2 \->LIST SWAP GXOR     @ put label in keyboard picture
  183.        END            @ end "if grob size = 0"
  184.       \>>                       @ end of x2, x1, y local variable block
  185.      PICT {#0d #0d} 
  186.      #131d n #8d * 2 \->LIST    @ coordinates of lower right corner of picture
  187.      SUB ugrob STO        @ extract picture from screen and store it
  188.      uvalues RCL        @ get key values list
  189.      DUP row GET        @ extract list for the row
  190.      DO                @ loop until valid key input
  191.       "C-constant object" 1 DISP @ display menu
  192.       "L-library constant" 2 DISP
  193.       "M-menu" 3 DISP
  194.       "N-no change" 4 DISP
  195.       "P-program name" 5 DISP
  196.       "U-unit" 6 DISP
  197.       0 WAIT IP            @ get (integer part of) key number
  198.       CASE
  199.        DUP 13 == THEN        @ "c" was pressed
  200.         DROP            @ drop key number
  201.         "Constant Object" { V }
  202.         INPUT OBJ\->            @ input constant as string and make it object
  203.         1 \->LIST        @ turn it into a one element list
  204.         1            @ leave 1 on stack to indicate success
  205.        END
  206.        DUP 26 == THEN        @ if "l" pressed
  207.         DROP            @ drop key number
  208.         "Constant Name" 
  209.         { \Ga } INPUT        @ input constant name as a string
  210.         "\<< '" SWAP +          @ make string 
  211.         "' CONST \>>" +        @ "\<< 'constantname' CONST \>>"
  212.         OBJ\->            @ turn string into a program
  213.         1 \->LIST        @ put program in a list
  214.         1            @ indicate success
  215.        END
  216.        DUP 31 == THEN        @ if "m" pressed
  217.         DROP            @ drop key number
  218.         "\<< '"            @ start of program string
  219.         "Graphic variable name" 
  220.         { \Ga } INPUT + "' '" + @ get name of picture variable, add to string
  221.         "Values variable name"
  222.         { \Ga } INPUT +
  223.         "' UMENU \>>" +        @ string contains
  224.                 @ "\<< 'grobname' 'valuename' UMENU \>>"
  225.         OBJ\->            @ turn string into a program
  226.         1 \->LIST        @ put program in a list
  227.         1            @ indicate success
  228.        END
  229.        DUP 32 == THEN        @ if "n" pressed
  230.         DROP            @ drop key number
  231.         DUP col GET 1 \->LIST   @ get current value of key to stack
  232.         1            @ indicate success
  233.        END
  234.        DUP 34 == THEN        @ if "p" pressed
  235.         DROP            @ drop key number
  236.         "Program name" { \Ga }
  237.         INPUT "\<< "        @ get program name as a string
  238.         SWAP + " \>>" + OBJ\->  @ make program \<< programname \>>
  239.         1 \->LIST               @ put into a list
  240.         1            @ indicate success
  241.        END
  242.         43 == THEN        @ if "u" pressed
  243.         "Unit Name" { \Ga } INPUT @ get unit as a string
  244.         \-> u
  245.          \<<
  246.           "\<< 1_" u + " * \>>"
  247.           + OBJ\->        @ make program \<< 1_unit * \>>
  248.           "\<< 1_" u + " CONVERT \>>"
  249.           + OBJ\->        @ make program \<< 1_unit CONVERT \>>
  250.           "\<< 1_" u + " / \>>"
  251.           + OBJ\->        @ make program \<< 1_unit / \>>
  252.           3 \->LIST        @ make a list of the three programs
  253.          \>>
  254.         1            @ indicate success
  255.        END
  256.        0            @ else indicate failure
  257.       END            @ end of case statement
  258.      UNTIL            @ loop again if 0 on stack
  259.      END
  260.      col SWAP PUT        @ put the object generated into row list
  261.      row SWAP PUT        @ put the modified row list into main list
  262.      uvalues STO        @ store in values variable
  263.     \>>                         @ end of row, col local variable block
  264.    ugrob uvalues        @ return variable names to stack
  265.   \>>                           @ end of ugrob, uvalues, n local variable block
  266. \>>                             @ end of program
  267.  
  268. Checksum: #42B7h  Size:263.5
  269. UMENU
  270. %%HP: T(3)A(D)F(.);
  271. \<<
  272.  \-> ugrob uvalues        @ store variable names in ugrob, uvalues
  273.   \<<
  274.    LCD\->            @ turn stack display into a picture
  275.    {#0d #0d} ugrob RCL REPL    @ overwrite the top of picture with keyboard
  276.    PICT STO            @ and store in graphics screen
  277.    {#0d #0d} PVIEW        @ store composite keyboard/stack display
  278.    0 WAIT            @ get keystroke
  279.    IFERR            @ (keystroke might be from too low on keyboard)
  280.     uvalues RCL         @ put values list on stack
  281.     OVER 10 / IP GET        @ extract row from this list (could give error)
  282.     OVER 10 MOD GET        @ extract key from row list (should not give
  283.                 @ error)
  284.    THEN                @ (does following if error)
  285.     DROP DROP DROP KILL        @ return stack to pristine status and die
  286.    END
  287.    IFERR            @ (values list might not have defined response
  288.                 @ for a shifted key, or the key might never 
  289.                 @ have been defined by UMOD)
  290.     SWAP FP 10 * GET         @ extract program from key list
  291.    THEN
  292.     DROP DROP KILL        @ restore stack and die
  293.    END
  294.    EVAL                @ execute the program extracted from values
  295.                 @ list
  296.   \>>                @ end of local variables list.
  297. \>>
  298.  
  299.